// 告诉你一棵树的前序排列和后序排列，确定这棵树可能的情况
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
typedef long long LL;
string pre, post;
int m;
LL ans;
unordered_map<char, int> postidx;



int C(int m, int k)
{
    int numerator = 1, denominator = 1;
    for (int i = 0; i<k; i++, m--)
        numerator *= m;
    for (int i = 1; i <= k; i++)
        denominator *= i;
    return numerator / denominator;
}

void dfs(int preS, int preE, int postS, int postE)//指示先序和后序某段区间
{
    if (preS >= preE)
        return;
    int i = preS + 1, cnt = 0;//cnt统计子树的个数,i是标识当前树的根节点的子树的根节点，在pre中的下标
    int idx = postidx[pre[i]];
    while (i <= preE)
    {
        dfs(i, i + idx - postS, postS, idx);
        cnt++;
        if (idx != postE - 1)//子树不止一个,把要递归搜索的树的区间整体移动
        {
            i += idx - postS + 1;   //idx-postS是刚刚递归过的子树的大小
                                  //i要跨过这个区间，找到下一个要搜索的根节点
            postS = idx + 1;    //post的区间起始位置也要前进1位
            idx = postidx[pre[i]];//idx重新定位下一个要搜索的子树根节点在post中的下标
        }
        else
            break;//完成对当前区间中所有字数根节点的全部搜索
    }
    ans *= C(m, cnt);//计算排列组合，cnt表示当前层有几个子树
}

int main()
{
    while(cin >> m && m)
    {
        ans = 1;
        cin >> pre >> post;
        for(int i = 0; i < post.size(); ++i)
            postidx[post[i]] = i;
        size_t sz = pre.size();
        dfs(0, sz - 1, 0, sz - 1);
        cout << ans << endl;
    }
    return 0;
}